package com.heima.wemedia.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.file.service.FileStorageService;
import com.heima.model.common.dtos.PageResponseResult;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.wemedia.dtos.WmMaterialDto;
import com.heima.model.wemedia.pojos.WmMaterial;
import com.heima.utils.thread.WmThreadLocalUtils;
import com.heima.wemedia.mapper.WmMaterialMapper;
import com.heima.wemedia.service.WmMaterialService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.Date;
import java.util.UUID;


@Slf4j
@Service
@Transactional
public class WmMaterialServiceImpl extends ServiceImpl<WmMaterialMapper, WmMaterial> implements WmMaterialService {

    @Autowired
    private FileStorageService fileStorageService;

    //图片上传
    public ResponseResult uploadPicture(MultipartFile multipartFile){

        //1.检查参数
        if(multipartFile==null||multipartFile.getSize()==0){
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
        //2.上传图片到minio,
        //生成不会重复的文件名，因为不喜欢-所以设置为空格格式，
        String fileName= UUID.randomUUID().toString().replace("-","");
        //aa.jpg
        String originalFilename=multipartFile.getOriginalFilename();
        //截取文件后缀/格式
        String postfix=originalFilename.substring(originalFilename.lastIndexOf("."));
        //看后面可以得知fileId是图片的url，可为什么这样组合会成为图片的url？
        // 文件的原名不会被保存？所以需要标识和保持后缀，拿这最终是文件名不是url呀，
        //文件名并没有被赋值，赋值的url是方法返回值，文件名只是参数而已，
        String fileId=null;
        try {
            fileId = fileStorageService.uploadImgFile("", fileName + postfix, multipartFile.getInputStream());
            log.info("上传图片到minio中，fileId:{}",fileId);
        } catch (IOException e) {
            e.printStackTrace();
            log.error("WmMaterialServiceImpl-上传文件失败");
        }

        //3.保存到数据库
        WmMaterial wmMaterial=new WmMaterial();
        wmMaterial.setUserId(WmThreadLocalUtils.getUser().getId());  //空指针异常，好像是服务重启后登录过期了，需要重开页面，刷新不行
        wmMaterial.setUrl(fileId);
        wmMaterial.setIsCollection((short) 0);
        wmMaterial.setType((short) 0);
        wmMaterial.setCreatedTime(new Date());
        save(wmMaterial);
        //save是MP的update方法，
        //4.返回数据
        return ResponseResult.okResult(wmMaterial);
    }

    //想让分页查询生效，需要添加MP插件，即在启动类添加分页bean（分页拦截器），
    @Override
    public ResponseResult findList(WmMaterialDto dto) {
        //1.检查参数，编写在实体类内部的数据校验逻辑，
        dto.checkParam();
        //2.分页查询
        IPage page=new Page(dto.getPage(),dto.getSize());
        //where其他条件（与分页无关的参数）被封装成了Wrapper类，一个一个添加，以方法参数的形式。
        LambdaQueryWrapper<WmMaterial> lambdaQueryWrapper=new LambdaQueryWrapper<>();
        //是否收藏
        if(dto.toString()!=null&&dto.getIsCollection()==1){
            //当参数列表的所有参数都为true时查询吗？还是两个参数相同时？讲义实例时前者字段名后者字段值，这个不是
            lambdaQueryWrapper.eq(WmMaterial::getIsCollection,dto.getIsCollection());
        }

        //按照用户查询et
        lambdaQueryWrapper.eq(WmMaterial::getUserId,WmThreadLocalUtils.getUser().getId());
        //按照时间倒序排列
        lambdaQueryWrapper.orderByDesc(WmMaterial::getCreatedTime);
        //page类似save，是MP封装的@S方法，用于分页查询，Ipage对象是用来接收其结果集的对象。
        page=page(page,lambdaQueryWrapper);
        //这句话语法很奇怪啊，只有对象.方法()，没有对象()或者方法()呀，这是mp的语法？
        //后面这个page相当于mp的关键字？前面才是对象名？
        //3.结果返回
        ResponseResult responseResult=new PageResponseResult(
                dto.getPage(),dto.getSize(), (int) page.getTotal());
        responseResult.setData(page.getRecords());
        return responseResult;
    }

    ;
}
